// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import "package:expect/expect.dart";

void checkBadSymbol(String s) {
  Expect.throwsArgumentError(() => new Symbol(s));
}

main() {
  var x;

  // 'void' is allowed as a symbol name.
  x = const Symbol('void'); //     //# 01: ok
  x = #void; //                    //# 02: ok
  x = new Symbol('void'); //       //# 03: ok

  // However, it is not allowed as a part of a symbol name.
  x = const Symbol('void.foo'); // //# 04: compile-time error
  x = #void.foo; //                //# 05: compile-time error
  checkBadSymbol('void.foo'); //   //# 06: ok
  x = const Symbol('foo.void'); // //# 07: compile-time error
  x = #foo.void; //                //# 08: compile-time error
  checkBadSymbol('foo.void'); //   //# 09: ok

  // All other reserved words are disallowed.
  x = const Symbol('assert'); //   //# 10: compile-time error
  x = const Symbol('break'); //    //# 10: continued
  x = const Symbol('case'); //     //# 10: continued
  x = const Symbol('catch'); //    //# 10: continued
  x = const Symbol('class'); //    //# 10: continued
  x = const Symbol('const'); //    //# 10: continued
  x = const Symbol('continue'); // //# 10: continued
  x = const Symbol('default'); //  //# 10: continued
  x = const Symbol('do'); //       //# 10: continued
  x = const Symbol('else'); //     //# 10: continued
  x = const Symbol('enum'); //     //# 10: continued
  x = const Symbol('extends'); //  //# 10: continued
  x = #assert; //                  //# 11: compile-time error
  x = const Symbol('false'); //    //# 10: continued
  x = const Symbol('final'); //    //# 10: continued
  x = const Symbol('finally'); //  //# 10: continued
  x = const Symbol('for'); //      //# 10: continued
  x = const Symbol('if'); //       //# 10: continued
  x = const Symbol('in'); //       //# 10: continued
  x = const Symbol('is'); //       //# 10: continued
  x = const Symbol('new'); //      //# 10: continued
  x = const Symbol('null'); //     //# 10: continued
  x = const Symbol('rethrow'); //  //# 10: continued
  x = const Symbol('return'); //   //# 10: continued
  x = const Symbol('super'); //    //# 10: continued
  x = const Symbol('switch'); //   //# 10: continued
  x = const Symbol('this'); //     //# 10: continued
  x = const Symbol('throw'); //    //# 10: continued
  x = const Symbol('true'); //     //# 10: continued
  x = const Symbol('try'); //      //# 10: continued
  x = const Symbol('var'); //      //# 10: continued
  x = const Symbol('while'); //    //# 10: continued
  x = const Symbol('with'); //     //# 10: continued
  x = #break; //                   //# 11: continued
  x = #case; //                    //# 11: continued
  x = #catch; //                   //# 11: continued
  x = #class; //                   //# 11: continued
  x = #const; //                   //# 11: continued
  x = #continue; //                //# 11: continued
  x = #default; //                 //# 11: continued
  x = #do; //                      //# 11: continued
  x = #else; //                    //# 11: continued
  x = #enum; //                    //# 11: continued
  x = #extends; //                 //# 11: continued
  x = #false; //                   //# 11: continued
  x = #final; //                   //# 11: continued
  x = #finally; //                 //# 11: continued
  x = #for; //                     //# 11: continued
  x = #if; //                      //# 11: continued
  x = #in; //                      //# 11: continued
  x = #is; //                      //# 11: continued
  x = #new; //                     //# 11: continued
  x = #null; //                    //# 11: continued
  x = #rethrow; //                 //# 11: continued
  x = #return; //                  //# 11: continued
  x = #super; //                   //# 11: continued
  x = #switch; //                  //# 11: continued
  x = #this; //                    //# 11: continued
  x = #throw; //                   //# 11: continued
  x = #true; //                    //# 11: continued
  x = #try; //                     //# 11: continued
  x = #var; //                     //# 11: continued
  x = #while; //                   //# 11: continued
  x = #with; //                    //# 11: continued
  checkBadSymbol('assert'); //     //# 12: ok
  checkBadSymbol('break'); //      //# 12: continued
  checkBadSymbol('case'); //       //# 12: continued
  checkBadSymbol('catch'); //      //# 12: continued
  checkBadSymbol('class'); //      //# 12: continued
  checkBadSymbol('const'); //      //# 12: continued
  checkBadSymbol('continue'); //   //# 12: continued
  checkBadSymbol('default'); //    //# 12: continued
  checkBadSymbol('do'); //         //# 12: continued
  checkBadSymbol('else'); //       //# 12: continued
  checkBadSymbol('enum'); //       //# 12: continued
  checkBadSymbol('extends'); //    //# 12: continued
  checkBadSymbol('false'); //      //# 12: continued
  checkBadSymbol('final'); //      //# 12: continued
  checkBadSymbol('finally'); //    //# 12: continued
  checkBadSymbol('for'); //        //# 12: continued
  checkBadSymbol('if'); //         //# 12: continued
  checkBadSymbol('in'); //         //# 12: continued
  checkBadSymbol('is'); //         //# 12: continued
  checkBadSymbol('new'); //        //# 12: continued
  checkBadSymbol('null'); //       //# 12: continued
  checkBadSymbol('rethrow'); //    //# 12: continued
  checkBadSymbol('return'); //     //# 12: continued
  checkBadSymbol('super'); //      //# 12: continued
  checkBadSymbol('switch'); //     //# 12: continued
  checkBadSymbol('this'); //       //# 12: continued
  checkBadSymbol('throw'); //      //# 12: continued
  checkBadSymbol('true'); //       //# 12: continued
  checkBadSymbol('try'); //        //# 12: continued
  checkBadSymbol('var'); //        //# 12: continued
  checkBadSymbol('while'); //      //# 12: continued
  checkBadSymbol('with'); //       //# 12: continued
}
